package com.gable.report.common.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 计算价格的辅助类，所有的加减乘除都用数学计算法，
 * 不然经度有可能丢失
 * @author jacky
 *
 */
public class CalculationUtil {
	
	/**
	 * 数学计算法的加法
	 * @param obj1
	 * @param obj2
	 * @return
	 */
	public static double add(Object obj1,Object obj2){
		if(obj1 == null  || obj2 == null){
			return 0;
		}
		BigDecimal bd1 = new BigDecimal(obj1.toString());
		BigDecimal bd2 = new BigDecimal(obj2.toString());
		return bd1.add(bd2).doubleValue();
	}
	
	
	/**
	 * 数学计算法的减法
	 * @param obj1
	 * @param obj2
	 * @return
	 */
	public static double subtract(Object obj1,Object obj2){
		if(obj1 == null  || obj2 == null){
			return 0;
		}
		BigDecimal bd1 = new BigDecimal(obj1.toString());
		BigDecimal bd2 = new BigDecimal(obj2.toString());
		return bd1.subtract(bd2).doubleValue();
	}
	
	
	/**
	 * 数学计算法的乘法
	 * @param obj1
	 * @param obj2
	 * @return
	 */
	public static double multiply(Object obj1,Object obj2){
		if(obj1 == null  || obj2 == null){
			return 0;
		}
		BigDecimal bd1 = new BigDecimal(obj1.toString());
		BigDecimal bd2 = new BigDecimal(obj2.toString());
		return bd1.multiply(bd2).setScale(2,RoundingMode.HALF_EVEN).doubleValue();
	}
	
	
	/**
	 * 数学计算法的除法
	 * @param obj1   被除数
	 * @param obj2  除数
	 * @param scale 保留小数
	 * @param round 处理方式，是四舍五入 BigDecimal.ROUND_HALF_UP  
	 * @return
	 */
	public static double divide(Object obj1,Object obj2,int scale,RoundingMode round){
		if(obj1 == null  || obj2 == null){
			return 0;
		}
		if(Long.parseLong(obj2.toString()) == 0){
			return 0;
		}
		
		if(scale<0){   
			return 0;
		}   
		
		BigDecimal bd1 = new BigDecimal(obj1.toString());
		BigDecimal bd2 = new BigDecimal(obj2.toString());
		return bd1.divide(bd2,scale,round).doubleValue();
	}
	
	public static String divide(String obj1,Integer num,int scale){
		BigDecimal bd1 = new BigDecimal(obj1);
		BigDecimal bd2 = new BigDecimal(num);
		DecimalFormat nf = new DecimalFormat("0.000");
		String str = nf.format( bd1.divide(bd2,scale,BigDecimal.ROUND_HALF_EVEN));
		return str;
	}

	public static String addForCost(String obj1,String obj2){
		BigDecimal bd1 = new BigDecimal(obj1);
		BigDecimal bd2 = new BigDecimal(obj2);
		DecimalFormat nf = new DecimalFormat("0.000");
		String str = nf.format(bd1.add(bd2));
		return str;
	}
}
